<?php
/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 textwidth=150 number: */

/**
 * Classe Viagem
 *
 * ...
 *
 * PHP versão 5
 *
 * LICENÇA: Este arquivo fonte esta sob o termos da licença MIT.
 *
 * @package   scuf.model
 * @author    Rodrigo Casara <rodrigocasara@gmail.com>
 * @copyright 2012 Rodrigo Casara
 * @license   MIT License (http://www.opensource.org/licenses/mit-license.php)
 * @version   SVN: $Id$
 * @link
 * @since     SCUF(tm) v 1.0.0
 */

App::uses('AppModel', 'Model');
App::uses('Utils', 'Lib');

/**
 * Viagem
 *
 * {@inheritdoc}
 */
class Viagem extends AppModel {

  //public $useTable = 'viagens';

  /**
   * Regras de validação
   *
   * @var array
   */
  public $validate = array(
    'municipio_origem_id' => array(
      'obrigatorio' => array(
        'rule' => array('notempty'),
        'message' => 'Obrigatório'
      ),
      'numeric' => array(
        'rule' => array('numeric'),
        'message' => 'Município inválido'
      ),
    ),
    'municipio_destino_id' => array(
      'obrigatorio' => array(
        'rule' => array('notempty'),
        'message' => 'Obrigatório'
      ),
      'numeric' => array(
        'rule' => array('numeric'),
        'message' => 'Município inválido'
      ),
    ),
    'motorista_pessoa_id' => array(
      'numeric' => array(
        'rule' => array('numeric'),
        'message' => 'Pessoa inválida'
      ),
    ),
    'veiculo_id' => array(
      'obrigatorio' => array(
        'rule' => array('notempty'),
        'message' => 'Obrigatório'
      ),
      'numeric' => array(
        'rule' => array('numeric'),
        'message' => 'Veículo inválido'
      ),
    ),
    'data_partida' => array(
      'obrigatorio' => array(
        'rule' => array('notEmpty'),
        'message' => 'Obrigatório'
      ),
      'date' => array(
        'rule' => array('date'),
        'message' => 'Data inválida'
      )
    ),
    'hora_partida' => array(
      'obrigatorio' => array(
        'rule' => array('notEmpty'),
        'message' => 'Obrigatório'
      ),
      //'time' => array(
      //  'rule' => array('time'),
      //  'message' => 'Hora inválida',
      //),
    ),
    'assentos_disponiveis' => array(
      'numerico' => array(
        'rule' => array('numeric'),
        'message' => 'Quantidade de assentos disponíveis inválida'
      ),
      'quantidade_minima' => array(
        'rule' => array('range', 2, 32767),
        'message' => 'Uma viagem deve disponibilizar no mínimo um assento'
      ),
      //'quantidade_maxima' => array(
      //  'rule' => array('???'),
      //  'message' => 'O número de assentos disponíveis excedeu o limite disponível no veículo'
      //),
    ),
    'preco' => array(
      'moeda' => array(
        'rule' => array('money', 'left'),
        'message' => 'Valor monetário inválido'
      ),
    ),
  );

  //public $tableToModel = array('caronas');

  /**
   * Associações "pertence à".
   *
   * @var array
   */
  public $belongsTo = array(
    'MunicipioOrigem' => array(
      'className' => 'Municipio',
      'foreignKey' => 'municipio_origem_id',
      'conditions' => '',
      'fields' => '',
      'order' => ''
    ),
    'MunicipioDestino' => array(
      'className' => 'Municipio',
      'foreignKey' => 'municipio_destino_id',
      'conditions' => '',
      'fields' => '',
      'order' => ''
    ),
    'MotoristaPessoa' => array(
      'className' => 'Pessoa',
      'foreignKey' => 'motorista_pessoa_id',
      'conditions' => '',
      'fields' => '',
      'order' => ''
    ),
    'Veiculo' => array(
      'className' => 'Veiculo',
      'foreignKey' => 'veiculo_id',
      'conditions' => '',
      'fields' => '',
      'order' => ''
    )
  );

  /**
   * Associações "tem muitos".
   *
   * @var array
   */
  public $hasMany = array(
    'Carona' => array(
        'className' => 'Carona',
        'foreignKey' => 'viagem_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
  );

  // CakePHP Callbacks {{{

  public function beforeValidate() {
    // Id do usuário autenticado {{{
    $idPessoa = AuthComponent::user('id');
    if (!$idPessoa) {
      // TODO: usuário não se autenticou, fazer alguma coisa a respeito.
      //$this->validationErrors['pessoa_id'] = array('Você precisa estar logado para realizar esta operação.');
      return false;
    }
    $this->data[$this->alias]['motorista_pessoa_id'] = $idPessoa;
    //}}}
    // Formata a data de partida no formato americano YYYY-MM-DD {{{
    if (isset($this->data[$this->alias]['data_partida'])) {
      $this->data[$this->alias]['data_partida'] = Utils::converterDataDMYParaSQL($this->data[$this->alias]['data_partida']);
    }
    //}}}
    return true;
  }

  //}}}

  public function temVeiculo() {
    $totalDeVeiculos = $this->Veiculo->find('count', array(
      'conditions' => array($this->Veiculo->alias . '.pessoa_id' => AuthComponent::user('id'))
    ));
    if ($totalDeVeiculos) {
      return true;
    }
    return false;
  }

  public function temPedidoDeCarona() {
    $totalDePeididos = $this->Carona->find('count', array(
      'conditions' => array($this->Carona->alias . '.viagem_id' => $this->id)
    ));
    if ($totalDePeididos) {
      return true;
    }
    return false;
  }

}

?>